package cn.com.basic.framework.aliyun.oss.upload;

import cn.com.basic.framework.aliyun.oss.OSSManager;
import cn.hutool.core.lang.Assert;
import com.aliyun.oss.model.Callback;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.UploadFileRequest;

/**
 * 断点续传方式上传
 *
 * @author zhuxj
 */
public class ResumeUploader extends Uploader {
    public ResumeUploader(OSSManager ossManager) {
        super(ossManager);
    }

    public void resumeUpload(String localFile, String bucketName, String objName, Callback callback) throws Throwable {

        Assert.isTrue(this.ossManager.getOss() != null, "oss client cannot be null");

        ObjectMetadata meta = new ObjectMetadata();
        // 指定上传的内容类型。
        meta.setContentType("text/plain");

        // 通过UploadFileRequest设置多个参数。
        UploadFileRequest uploadFileRequest = new UploadFileRequest(bucketName, objName);

        // 指定上传的本地文件。
        uploadFileRequest.setUploadFile(localFile);
        // 指定上传并发线程数，默认为1。
        uploadFileRequest.setTaskNum(5);
        // 指定上传的分片大小，范围为100KB~5GB，默认为文件大小/10000。
        uploadFileRequest.setPartSize(1024 * 1024);
        // 开启断点续传，默认关闭。
        uploadFileRequest.setEnableCheckpoint(true);
        // 记录本地分片上传结果的文件。开启断点续传功能时需要设置此参数，上传过程中的进度信息会保存在该文件中，如果某一分片上传失败，再次上传时会根据文件中记录的点继续上传。上传完成后，该文件会被删除。默认与待上传的本地文件同目录，为uploadFile.ucp。
//        uploadFileRequest.setCheckpointFile("<yourCheckpointFile>");
        // 文件的元数据。
        uploadFileRequest.setObjectMetadata(meta);
        // 设置上传成功回调，参数为Callback类型。
        uploadFileRequest.setCallback(callback);

        // 断点续传上传。
        this.ossManager.getOss().uploadFile(uploadFileRequest);
    }
}
